/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.core.manager;

import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ArchivoDto;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.context.FacesContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class ArchivoManager extends ComunManager<ArchivoDto>  implements Serializable{
    private static Logger logger = Logger.getLogger(ArchivoManager.class);
    
    @Resource
    private DAOGenerico<ArchivoDto> springHibernateDao;
    
    @Resource
    private RecursosManager recursosManager;
    
    public List<ArchivoDto> obtenerTodos() throws DAOException {        
        return springHibernateDao.listarTodosDtos(ArchivoDto.class);
    }    
    
    public void guardarVarios(List<ArchivoDto> lista) throws DAOException {        
        springHibernateDao.guardarColeccion(lista);
    }    
    
    public List<ArchivoDto> obtenerTodosActivo() throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("estado", Boolean.TRUE);
        Map<String,String> orden = new HashMap<String, String>();
        orden.put("nombre", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(ArchivoDto.class, filtros,orden);
    }
    
    public List<ArchivoDto> obtenerArchivosRegistro(Long entidad, Long registro) throws DAOException {
        Map<String, Object> filtros = new HashMap<String, Object>();
        filtros.put("entidad", entidad);
        filtros.put("registro", registro);
        filtros.put("esAtributo", Boolean.FALSE);
        Map<String,String> orden = new HashMap<String, String>();
        orden.put("nombre", "asc");
        return springHibernateDao.obtenerDtosConFiltrosConOrden(ArchivoDto.class, filtros,orden);
    }
    
    
    public List<ArchivoDto> obtenerConFiltro(Map<String, Object> filtros) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltros(ArchivoDto.class, filtros);
    }
    
    public List<ArchivoDto> obtenerConFiltroConOrden(Map<String, Object> filtros,Map<String,String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(ArchivoDto.class, filtros,orden);
    }
    public ArchivoDto obtenerPorId(Long id) throws DAOException {
       return springHibernateDao.obtenerDtoPorId(ArchivoDto.class, id);
    }  
    
    public void viewArchivoDownload(String archivo) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        response.setContentType("application/force-download");
        response.addHeader("Content-Disposition", "attachment; filename=\"" + archivo + "\"");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        byte[] buf = new byte[1024];
        try {
            File file = new File(applicationMBean.getRutaArchivos() + archivo);
            long length = file.length();
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
            ServletOutputStream out = response.getOutputStream();
            response.setContentLength((int) length);
            while ((in != null) && ((length = in.read(buf)) != -1)) {
                out.write(buf, 0, (int) length);
            }
            in.close();
            out.close();
        } catch (Exception exc) {
            logger.error(exc);
        }
    }
    
    public void viewArchivoHtml(String archivo) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        response.setContentType("html");
        response.addHeader("Window-target:","_blank"); 
        response.addHeader("Content-Disposition", "inline; filename=\"" + archivo + "\"");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        byte[] buf = new byte[1024];
        try {
            File file = new File(applicationMBean.getRutaArchivos() + archivo);
            long length = file.length();
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
            ServletOutputStream out = response.getOutputStream();
            response.setContentLength((int) length);            
            while ((in != null) && ((length = in.read(buf)) != -1)) {
                out.write(buf, 0, (int) length);
            }
            in.close();
            out.close();
        } catch (Exception exc) {
            logger.error(exc);
        }
    }
}
